package day10;

import java.util.*;

//b.创建一个Java程序，其中定义一个共享的银行账户类`BankAccount`，
//该类有一个余额成员变量`balance`和两个方法：`deposit(int amount)`用于存款，
//`withdraw(int amount)`用于取款。创建多个线程，每个线程代表一个用户，
// 随机对账户进行存款和取款操作。使用`synchronized`关键字确保账户余额的更新是线程安全的，并打印出每次操作后的账户余额。
//提示：
//- 在`BankAccount`类的`deposit`和`withdraw`方法上使用`synchronized`关键字来确保同一时间只有一个线程可以访问这些方法。
//- 创建多个线程，每个线程在循环中随机选择存款或取款操作，并调用相应的同步方法
public class BankAccount {
    double balance;

    public synchronized void deposit(int amount) {
        String name = Thread.currentThread().getName();
        balance += amount;
        System.out.println(name + "存入了" + amount + "元,当前余额为:" + balance + "元");
    }

    public synchronized void withdrow(int amount) {
        String name = Thread.currentThread().getName();
        if (amount <= balance) {
            balance -= amount;
            System.out.println(name + "取出了" + amount + "元,当前余额为:" + balance + "元");
        } else {
            System.out.println(name + "想取出" + amount + "元,但是余额不足");
        }
    }

    public static void main(String[] args) {
        BankAccount ba = new BankAccount();
        Scanner sc = new Scanner(System.in);
        Random r = new Random();
        System.out.println("请输入用户数:");
        int account = sc.nextInt();
        for (int i = 0; i < account; i++) {
            new Thread(() -> {
                while (true) {
                    int n = r.nextInt(2);
                    try {
                        if (n == 0) {
                            ba.deposit(r.nextInt(100) + 1);
                        } else {
                            ba.withdrow(r.nextInt(100) + 1);
                        }
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }, "用户" + (i + 1)).start();
        }
    }
}
